package com.afkt.project.util.assist;

import com.afkt.project.model.item.TabItem;
import com.afkt.project.util.LogUtils;
import com.dev.DevUtils;
import com.dev.utils.app.HandlerUtils;
import com.dev.utils.app.helper.ViewHelper;
import ohos.agp.components.TabList;
import ohos.app.Context;

import java.util.ArrayList;
import java.util.List;

/**
 * detail: TabList 辅助类
 *
 * @author Ttt
 */
public class TabListAssist {
    // 日志 TAG
    private final String TAG = TabListAssist.class.getSimpleName();

    // Context
    private static Context mContext;
    // TabLayout
    private  TabList mtabList;

    private TabList.Tab tab;
    // 数据源
    private  final List<TabItem> mlistTabs = new ArrayList<>();

    private TabListAssist() {
    }

    /**
     * 初始化操作
     */
    private void initOperate() {
        // 默认删除全部 Tab
          mtabList.removeAllComponents();
        // 循环遍历
        LogUtils.error(TAG, mlistTabs.size() + "");
        for (int i = 0, len = mlistTabs.size(); i < len; i++) {
            tab = mtabList.new Tab(mContext);
            tab.setText(mlistTabs.get(i).getTitle());
            mtabList.addTab(tab);
        }
        // Tab 切换选择事件
        mtabList.addTabSelectedListener(new TabList.TabSelectedListener() {
            @Override
            public void onSelected(TabList.Tab tab) {
                // 切换状态
                updateTabTextView(tab, true);
                // 不为 null, 则触发
                if (tabChangeListener != null) {
                    tabChangeListener.onTabChange(mlistTabs.get(tab.getPosition()), tab.getPosition());
                }
            }

            @Override
            public void onUnselected(TabList.Tab tab) {
                // 切换状态
                updateTabTextView(tab, false);
            }

            @Override
            public void onReselected(TabList.Tab tab) {

            }
        });
    }


    /**
     * 设置TabList 是否可滑动
     * @param isFixed true 表示不可滑动 适合较少情况 false表示可滑动
     */
    public TabListAssist setFixedMode(boolean isFixed) {
        mtabList.setFixedMode(isFixed);
        return this;
    }

    /**
     * 改变 Tab TextView 选中状态
     *
     * @param tab      Tab
     * @param isSelect 是否选中
     */
    private void updateTabTextView(
            TabList.Tab tab,
            boolean isSelect
    ) {
        ViewHelper.get().setBold(tab, isSelect);
    }

    // ===============
    // = 对外公开方法 =
    // ===============

    /**
     * 获取 TabLayout 辅助类
     *
     * @param tabList {@link TabList}
     * @return {@link TabListAssist}
     */
    public static TabListAssist get(TabList tabList) {
        if (tabList == null) return null;
        TabListAssist tabListAssist = new TabListAssist();
        mContext = DevUtils.getContext();
        tabListAssist.mtabList = tabList;
        return tabListAssist;
    }

    /**
     * 设置数据操作
     *
     * @param listTabs Tab Item 集合
     * @return {@link TabListAssist}
     */
    public TabListAssist setListTabs(List<TabItem> listTabs) {
        if (listTabs != null) {
            // 清空旧的
            mlistTabs.clear();
            mlistTabs.addAll(listTabs);
            LogUtils.error(TAG, mlistTabs.size() + "");
        }
        // 初始化操作
        initOperate();
        return this;
    }

    /**
     * 获取选中的 Tab 索引
     *
     * @return 选中的 Tab 索引
     */
    public int getSelectedTabPosition() {
        return mtabList.getSelectedTabIndex();
    }

    /**
     * 获取 Tab 总数
     *
     * @return Tab 总数
     */
    public int getTabCount() {
        return mtabList.getTabCount();
    }

    // ===============
    // = Tab 切换事件 =
    // ===============

    /**
     * detail: Tab 切换事件
     *
     * @author Ttt
     */
    public interface TabChangeListener {

        void onTabChange(
                TabItem tabItem,
                int pos
        );
    }

    // Tab 切换事件
    private TabChangeListener tabChangeListener;

    /**
     * 设置 Tab 切换事件
     *
     * @param tabChangeListener {@link TabChangeListener}
     * @return {@link TabListAssist}
     */
    public TabListAssist setTabChangeListener(TabChangeListener tabChangeListener) {
        this.tabChangeListener = tabChangeListener;
        return this;
    }

    /**
     * 设置选中索引
     *
     * @param position 选中索引
     * @return {@link TabListAssist}
     */
    public TabListAssist setSelect(int position) {
        return setSelect(position, true);
    }

    /**
     * 设置选中
     *
     * @param position 选中索引
     * @param isScroll 是否滑动
     * @return {@link TabListAssist}
     */
    public TabListAssist setSelect(
            int position,
            boolean isScroll
    ) {
        try {
            mtabList.selectTabAt(position);
            // 切换选中状态
            updateTabTextView(mtabList.getSelectedTab(), true);
        } catch (Exception e) {
        }
        // 滑动处理
        if (isScroll) scrollTab(getSelectedTabPosition());
        return this;
    }

    /**
     * 滑动 Tab 处理
     *
     * @param pos 需要滑动的索引
     */
    private void scrollTab(final int pos) {
        // 延时移动
        HandlerUtils.postRunnable(new Runnable() {
            @Override
            public void run() {
                try {
                    int x = 0;
                    // 循环遍历
                    for (int i = 1; i < pos; i++) {
                        try {
                            // 累加宽度
                            x += mtabList.getTabAt(i).getWidth();
                        } catch (Exception e) {
                            LogUtils.error(TAG, e + "scrollTab");
                        }
                    }
                    // 开始移动位置
                    mtabList.scrollTo(x, 0);
                    LogUtils.error(TAG, x + "滑动距离");
                } catch (Exception e) {
                    LogUtils.error(TAG, e + "scrollTab");
                }
            }
        }, 100);
    }


}
